/*
 * $Log: IBaseDao.java,v $
 * Revision 1.1  2012/04/13 08:40:06  guor
 * *** empty log message ***
 *
 */
package com.xlcszsgc.core.basedao.base;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Collection;

import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.xlcszsgc.core.basedao.condition.BaseCondition;
import com.xlcszsgc.core.basedao.condition.BasePageCondition;

/**
 * Title: IBaseDao<br>
 * Description: 持久化层基类接口<br>
 * Company: ORCHIS<br>
 * Copyright @ 2011 ORCHIS .All rights reserved.<br>
 * @author WangWB
 * @createDate Aug 1, 2011
 * @version $Revision: 1.1 $
 */
public interface IBaseDao {
	/**
	 * 获得Session
	 * 
	 * @return
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public Session getHibernateSession() throws Exception;

	/**
	 * 获得Connection
	 * 
	 * @return
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public Connection getJDBCConnection() throws Exception;

	/**
	 * 释放由于使用JDBC而开启的ResultSet,Statement,Connection
	 * 
	 * @param rSet
	 *            用于待释放的ResultSet
	 * @param statement
	 *            用于待释放的Statement或PrepareStatement
	 * @param connection
	 *            用于待释放的Connection
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 2, 2011
	 */
	public void releaseJDBCConnection(ResultSet rSet, Statement statement,
			Connection connection) throws Exception;

	/**
	 * 获得HibernateTemplate对象
	 * 
	 * @return
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public HibernateTemplate getSpringHibernateTemplate() throws Exception;

	/**
	 * 单个实体入库
	 * 
	 * @param entity
	 *            必须保证entity为带有@Entity标识的对象，并且保证被@Id注解的属性无值
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public void addEntity(Object entity) throws Exception;

	/**
	 * 多个同类型实体批量入库
	 * 
	 * @param entities
	 *            实体对象集合，必须保证每个实体对象都带有@Entity标识，并且保证保证被@Id注解的属性无值
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public void batchAddEntities(Collection<?> entities) throws Exception;

	/**
	 * 根据主键批量删除
	 * 
	 * @param entities
	 *            实体对象集合，必须保证每个实体对象都带有@Entity标识，并且保证被@Id注解的属性有值
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public void batchDeleteEntities(Collection<?> entities) throws Exception;

	/**
	 * 根据主键更新
	 * 
	 * @param entity
	 *            必须保证entity为带有@Entity标识的对象，并且保证被@Id注解的属性有值
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public void updateEntityByPK(Object entity) throws Exception;

	/**
	 * 根据主键删除
	 * 
	 * @param entity
	 *            必须保证entity为带有@Entity标识的对象，并且保证被@Id注解的属性有值
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public void deleteEntityByPK(Object entity) throws Exception;

	/**
	 * 查询数据count
	 * 
	 * @param condition
	 * @return
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 3, 2011
	 */
	public Long countCollection(BasePageCondition condition) throws Exception;

	/**
	 * 查询数据集，带翻页
	 * 
	 * @param condition
	 *            查询参数必须继承BasePageCondition类<br>
	 *            参数中的query和basebean为必要条件<br>
	 *            query中需要设置好查询hql和占位符<br>
	 *            basebean为结果集反射类
	 * @return
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public Collection<?> findCollectionWithPage(BasePageCondition condition)
			throws Exception;

	/**
	 * 查询数据集，不带翻页
	 * 
	 * @param condition
	 *            查询参数必须继承BasePageCondition类<br>
	 *            参数中的query和basebean为必要条件<br>
	 *            query中需要设置好查询hql和占位符<br>
	 *            basebean为结果集反射类
	 * @return
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 1, 2011
	 */
	public Collection<?> findCollectionWithoutPage(BaseCondition condition)
			throws Exception;

	/**
	 * 查询JDBC结果集，带分页
	 * 
	 * @param condition
	 *            参数中的statement、sql和basebean为必要条件<br>
	 *            statement中需要设置好查询sql和占位符<br>
	 *            sql为查询语句，只需设置本身查询语句，无需设置分页语句<br>
	 *            basebean为结果集反射类，set方法中set后面全部为大写，例如“setNAME”。浮点型只支持双精度浮点型，若有整形，需要在BaseBean中的各set方法做int转换
	 * @return
	 * @throws Exception
	 * @author LiuHQ
	 * @date 2011-10-24
	 */
	public Collection<?> findCollectionWithPageJDBC(BasePageCondition condition)
			throws Exception;

	/**
	 * 查询JDBC结果集，不带分页
	 * 
	 * @param condition
	 *            参数中的statement、sql和basebean为必要条件<br>
	 *            statement中需要设置好查询sql和占位符，若使用PreparedStatement则无需设置sql<br>
	 *            sql为查询语句<br>
	 *            basebean为结果集反射类，set方法中set后面全部为大写，例如“setNAME”。浮点型只支持双精度浮点型，若有整形，需要在BaseBean中的各set方法做int转换
	 * @return
	 * @throws Exception
	 * @author WangWB
	 * @date Oct 28, 2011
	 */
	public Collection<?> findCollectionWithoutPageJDBC(BaseCondition condition)
			throws Exception;

	/**
	 * 通过JDBC查询集合count
	 * 
	 * @param condition
	 *            参数中的statement和sql为必要条件<br>
	 *            statement中需要设置好查询sql和占位符，若使用PreparedStatement则无需设置sql<br>
	 *            sql为查询语句<br>
	 * @return
	 * @throws Exception
	 * @author LiuHQ
	 * @date 2011-10-24
	 */
	public Long countCollectionJDBC(BasePageCondition condition)
			throws Exception;

	/**
	 * 根据主键查询某一对象
	 * 
	 * @param objectClass
	 *            要查询的实体对象
	 * @param id
	 *            主键
	 * @return
	 * @throws Exception
	 * @author WangWB
	 * @date Aug 5, 2011
	 */
	public Object findObject(Class<?> objectClass, Object id) throws Exception;

	/**
	 * 查询JDBC结果集，带分页
	 * 
	 * @param condition
	 * @return
	 * @throws Exception
	 * @author LiuHQ
	 * @date 2011-10-24
	 */
	@Deprecated
	public ResultSet findResultSetWithJDBCPage(BasePageCondition condition)
			throws Exception;

}
